Ce post présente la dynamique de l'épidémie et propose des graphiques montrant différentes normalisations des données permettant de mesurer les variations de la vitesse de propagation du virus.

J'ai commencé ce projet en avril 2020, lorsque la dynamique de l'épidémie était très incertaine, durant le confinement en France. Mon objectif est de mettre à jour les données toutes les semaines pour permettre un suivi des chiffres loin du sensationnalisme et des sous-estimations que l'on peut retrouver dans les médias.

Dans ce contexte, l'accent est mis sur les données pondérées sur 7 jours, ce qui permet de lisser les fluctuations importantes que l'on observe entre les différents jours de la semaine. Vous retrouverez le code utilisé à l'adresse suivante : payoto/covid19-viz

import pandas as pd
from matplotlib import pyplot as plt
import requests
import datetime
from IPython.display import display, Markdown
display(Markdown("Article mis à jour le {}".format(datetime.date.today().strftime("%d/%m/%Y"))))

Article mis à jour le 17/10/2020

Mise à jour des commentaires

Le 17/10/2020

Tous les indicateurs montrent une croissance exponentielle de la maladie et une deuxième vague sérieuse se profile.

Le taux d'accroissement journalier +5% pour tous les indicateurs.

Le 11/10/2020

  • Nous observons sur les trois dernières semaines une stabilisation du nombre de réanimation : nous observons une augmentation linéaire de 25 personnes en réanimation par jour. C'est un signe encourageant qui suggère que l'épidémie a ralenti il y a quelques semaines. Malheureusement ceci ne nous donne pas d'information sur la trajectoire des deux dernières semaines.
  • Ajout du nombre de cas aux graphiques concernant la France.

Le 27/09/2020

Aujourd'hui une vue agrandie sur les dernières semaines est ajoutée.

  • Nous observons un phénomène surprenant d'une baisse de nombre de personne à l'hôpital, cela semble être un phénomène externe qui ne correspond pas à la dynamique de la maladie ;
  • un relativement grand nombre de décès le 18/09 (80) sort de la tendance en cours.

Le 20/09/2020

Deux points importants apparaissent dans les données :

  • L'augmentation du nombre de personne en réanimation et hôpital semble se stabiliser autour de +5% par jour (doublement toutes les deux semaines) ;
  • Sans surprise, les tendances en réanimations et hospitalisations commencent à apparaître dans les courbes de décès.
from viz import *

Données de DataAgainst Covid-19

Les données utilisées sont celles de DataAgainst COVID-19 (aka opencovid19-fr) [github.com/opencovid19-fr/data]. Elles sont mises à jour quotidiennement.

file_name = 'opencovid19-fr-chiffres-cles.csv'
url = 'https://raw.githubusercontent.com/opencovid19-fr/data/master/dist/chiffres-cles.csv'
myfile = requests.get(url)
open(file_name, 'wb').write(myfile.content)
data = pd.read_csv('opencovid19-fr-chiffres-cles.csv')
data.tail()
date granularite maille_code maille_nom cas_confirmes cas_ehpad cas_confirmes_ehpad cas_possibles_ehpad deces deces_ehpad reanimation hospitalises nouvelles_hospitalisations nouvelles_reanimations gueris depistes source_nom source_url source_archive source_type
29309 2020-10-17 region REG-75 Nouvelle-Aquitaine NaN NaN NaN NaN 579.0 NaN 66.0 451.0 33.0 2.0 3133.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
29310 2020-10-17 region REG-76 Occitanie NaN NaN NaN NaN 696.0 NaN 177.0 726.0 68.0 15.0 4356.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
29311 2020-10-17 region REG-84 Auvergne-Rhône-Alpes NaN NaN NaN NaN 2133.0 NaN 275.0 1798.0 206.0 28.0 10630.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
29312 2020-10-17 region REG-93 Provence-Alpes-Côte d'Azur NaN NaN NaN NaN 1271.0 NaN 221.0 1115.0 134.0 18.0 9188.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
29313 2020-10-17 region REG-94 Corse NaN NaN NaN NaN 68.0 NaN 8.0 39.0 7.0 2.0 317.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
data = enable_time_series_plot(data, timein_field="date", timeseries_field_out="t")

Dernières données pour la France

Ici, nous tabulons les derniers jours de données pour la France. Les données brutes ainsi que les données avec une moyenne glissante sur 7 jours sont calculées. Nous n'observons que les réanimations, les hospitalisations et les décès. Les données de cas confirmés ont longtemps été insuffisantes pour permettre une analyse intelligente de l'épidémie.

Dans les graphiques ci-après nous analysons trois types de données :

  • les données brutes d'entrées en réanimation et de décès ;
  • ces même données pondérées sur 7 jours ;
  • ces données pondérées normalisée par le nombre de personnes en réanimation.

Ce troisième graphique donne donc une indication de l'accélération ou ralentissement, même lorsque les données sont d'ampleurs très différentes.

maille_active = 'FRA'
fra = oc19_data_preproc(data, maille_active)
fra.tail(10)
deces deces_ehpad reanimation hospitalises cas_confirmes reanimation_cumul hospitalises_cumul deces_jour deces_jour_jour deces_ehpad_jour ... deces_ehpad_jour_mma_jour deces_jour_prop deces_ehpad_jour_prop reanimation_jour_prop hospitalises_jour_prop cas_confirmes_jour_prop reanimation_cumul_jour_prop hospitalises_cumul_jour_prop reanimation_solde_vivant_jour_prop deces_jour_mma_jour_prop
t
2020-10-07 21660.0 10785.0 1416.0 7536.0 653509.0 379470.0 2575615.0 80.0 18.0 0.0 ... 0.000000 0.002612 0.001232 0.017958 0.017933 0.019668 0.003552 0.002739 0.057910 0.042929
2020-10-08 21736.0 10785.0 1427.0 7624.0 671638.0 380897.0 2583239.0 76.0 -4.0 0.0 ... 0.000000 0.002688 0.001232 0.016218 0.018213 0.020022 0.003599 0.002784 0.057163 0.031785
2020-10-09 21798.0 10832.0 1448.0 7864.0 691977.0 382345.0 2591103.0 62.0 -14.0 47.0 ... -6.000000 0.002779 0.000673 0.016969 0.020092 0.021125 0.003650 0.002837 0.058800 0.035377
2020-10-10 21852.0 10832.0 1465.0 7997.0 718873.0 383810.0 2599100.0 54.0 -8.0 0.0 ... 0.000000 0.002844 0.000673 0.016577 0.022133 0.022306 0.003699 0.002896 0.058996 0.025287
2020-10-11 21898.0 10832.0 1492.0 8252.0 734974.0 385302.0 2607352.0 46.0 -8.0 0.0 ... 0.000000 0.002929 0.000673 0.014458 0.021986 0.022505 0.003741 0.002957 0.057449 0.031180
2020-10-12 21993.0 10832.0 1548.0 8692.0 743479.0 386850.0 2616044.0 95.0 49.0 0.0 ... 0.000000 0.003085 0.000673 0.012274 0.022977 0.022905 0.003775 0.003023 0.056109 0.054737
2020-10-13 22077.0 10856.0 1642.0 8949.0 756472.0 388492.0 2624993.0 84.0 -11.0 24.0 ... 2.857143 0.003216 0.000934 0.018792 0.024759 0.022984 0.003838 0.003097 0.062032 0.044266
2020-10-14 22181.0 10856.0 1673.0 9194.0 779063.0 390165.0 2634187.0 104.0 20.0 0.0 ... 0.000000 0.003356 0.000934 0.021945 0.025762 0.023023 0.003916 0.003176 0.066433 0.046065
2020-10-15 22269.0 10856.0 1750.0 9605.0 809684.0 391915.0 2643792.0 88.0 -16.0 0.0 ... 0.000000 0.003419 0.000934 0.026367 0.029464 0.024356 0.004016 0.003272 0.069878 0.022514
2020-10-16 22391.0 10912.0 1800.0 10042.0 834770.0 393715.0 2653834.0 122.0 34.0 56.0 ... 1.285714 0.003783 0.001047 0.027937 0.030984 0.024437 0.004126 0.003377 0.075000 0.101180

10 rows × 50 columns

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Dynamique de l'épidémie

Dans les graphiques qui suivent nous regardons sur l'axe des abscisses le nombre de personnes dans un état donné de maladie COVID. Vous retrouvez ces valeurs sur le graphique de gauche.

Au milieu, l'axe des ordonnées représente le changement de jour en jour de l'axe des abscisses, les points indique les données brutes, et la ligne les données moyennées.

A droite, ces mêmes données de l'axe des ordonnées sont normalisées pour indiquer un changement en pourcents par jour.

Chaque couleur correspond à une semaine.

def plots_maille_code(maille_active='FRA', **kwargs):
    fra = oc19_data_preproc(data, maille_active)
    plt.close()
    # plot_field_loops(fra, "deces_ehpad", center=False, maille_active=maille_active)
    plot_field_loops(fra, "hospitalises_cumul", [7], center=True, maille_active=maille_active, **kwargs)
    plot_field_loops(fra, "reanimation_cumul", [7], center=True, maille_active=maille_active, **kwargs)
    plot_field_loops(fra, "deces", center=False, maille_active=maille_active, **kwargs)
    if maille_active == "FRA":
        plt.show()
        display(Markdown(
            "Pour la France le nombre de cas peut-être analysé. Contrairement aux autres"
            + " quantités le nombre de cas est lissé sur 14 jours avec une fenêtre triangulaire."
        ))
        plot_field_loops(
            fra, "cas_confirmes", [14], center=True, maille_active=maille_active,
            win_type='triang', **kwargs
        )
    return fra
_ = plots_maille_code(maille_active='FRA')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Pour la France le nombre de cas peut-être analysé. Contrairement aux autres quantités le nombre de cas est lissé sur 14 jours avec une fenêtre triangulaire.

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Il est intéressant de zoomer sur les données depuis la fin du confinement.

_ = plots_maille_code(maille_active='FRA', start_date='2020-05-18')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Pour la France le nombre de cas peut-être analysé. Contrairement aux autres quantités le nombre de cas est lissé sur 14 jours avec une fenêtre triangulaire.

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Ces courbes évoluent en boucles (ou en spirale en cas de plusieurs vagues successives) :

  • Au début de l'épidémie les courbes commencent à l’origine ;
  • puis se suit une accélération rapide dans la partie supérieure du graphique ;
  • avec le confinement l'augmentation de jour en jour ralenti, cela se voit à la pente négative dès la semaine du 23 Mars ;
  • l'épidémie atteint son pic la semaine du 06 Avril ;
  • Nous voyons ensuite une réduction stable autour de 5% par jour jusqu'à la semaine du 08 Juin ;
  • La période estivale indique bien que l'épidémie n'allait pas disparaître car ne retournant pas à l’origine ;
  • depuis le 15 Août le nombre de d'hospitalisations et de réanimation s'accroit et c'est la deuxième semaine de Septembre qui semble indiqué qu'une deuxième vague a commencé.

Une deuxième vague se manifestera comme une spirale dans les graphiques au-dessus.

Dynamique en Ile de France

Ici les mêmes graphiques sont présentés pour l'île de France.

_ = plots_maille_code(maille_active='REG-11')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
_ = plots_maille_code(maille_active='REG-11', start_date='2020-05-18')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Graphes par régions

Pour chaque région les nombres de réanimation et de décès ainsi que leur dynamique sont présentées ci-dessous.

list_reg = [r for r in data["maille_code"].unique() if "REG" in r]
for reg in list_reg:
    oc19_data_preproc(data, reg)
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">